package com.askyjt.videosearch.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.askyjt.videosearch.bo.SocketDTO;
import org.springframework.stereotype.Component;

import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;

/**
 * 使用socket调用python服务中的VGG神经网络提取特征。
 * @author yanjintao
 */
@Component
public class SocketUtil {

    /**
     * 要调用的进程的host地址和端口
     */
    public static final String TARGET_HOST = "127.0.0.1";

    public static final int PORT = 7777;

    /**
     * 使用
     *
     * @param socketDTO
     * @return
     */
    public static Result<Map<String,List<String>>> remoteCallSearch(SocketDTO socketDTO) {


        String str = JSON.toJSONString(socketDTO);
        // 访问服务进程的套接字
        Socket socket = null;

        try {
            // 初始化套接字，设置访问服务的主机和进程端口号，HOST是访问python进程的主机名称，可以是IP地址或者域名，PORT是python进程绑定的端口号
            socket = new Socket(TARGET_HOST, PORT);
            // 获取输出流对象
            OutputStream os = socket.getOutputStream();
            PrintStream out = new PrintStream(os);
            // 发送内容
            out.print(str);
            // 告诉服务进程，内容发送完毕，可以开始处理
            out.print("over");
            // 获取服务进程的输入流
            InputStream is = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
            String tmp = null;
            StringBuilder sb = new StringBuilder();
            // 读取内容
            while ((tmp = br.readLine()) != null) {
                sb.append(tmp);
            }
            //删除字符串两端多余的双引号避免json转换错误
            //String result = sb.substring(1, (sb.length() - 1));
            // 解析结果
            return JSON.parseObject(sb.toString(), new TypeReference<Result<Map<String,List<String>>>>(){});
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (socket != null) {
                    socket.close();
                }
            } catch (IOException e) {
            }
            //  log.info("远程接口调用结束.");
        }
        return null;
    }
    public static Result<Map<String, List<String>>> remoteCallAdd(SocketDTO socketDTO) {

        String str = JSON.toJSONString(socketDTO);
        // 访问服务进程的套接字
        Socket socket = null;

        try {
            // 初始化套接字，设置访问服务的主机和进程端口号，HOST是访问python进程的主机名称，可以是IP地址或者域名，PORT是python进程绑定的端口号
            socket = new Socket(TARGET_HOST, PORT);
            // 获取输出流对象
            OutputStream os = socket.getOutputStream();
            PrintStream out = new PrintStream(os);
            // 发送内容
            out.print(str);
            // 告诉服务进程，内容发送完毕，可以开始处理
            out.print("over");
            // 获取服务进程的输入流
            InputStream is = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
            String tmp = null;
            StringBuilder sb = new StringBuilder();
            // 读取内容
            while ((tmp = br.readLine()) != null) {
                sb.append(tmp);
            }
            //删除字符串两端多余的双引号避免json转换错误
//            String result = sb.substring(1, (sb.length() - 1));
            // 解析结果
            return JSON.parseObject(sb.toString(), new TypeReference<Result<Map<String,List<String>>>>(){});
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (socket != null) {
                    socket.close();
                }
            } catch (IOException e) {
            }
            //  log.info("远程接口调用结束.");
        }
        return null;
    }
}
